/*
 * Copyright (c) 2022-2022 All rights Reserved.
 */

package com.driving.core.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ApplicationObjectSupport;

/**
 * SpringContext工具类，获取Spring容器的组件
 *
 * @author SAGITTAR
 * @since 2017
 */
public class SpringContextUtils extends ApplicationObjectSupport {

    private static ApplicationContext applicationContext;

    @Override
    protected void initApplicationContext(ApplicationContext context) throws BeansException {
        SpringContextUtils.applicationContext = context;
    }

    /**
     * 返回指定类型的Spring Bean，没有或多于一个都将报错
     *
     * @param cls Bean类型
     * @param <T> 类型
     * @return 返回指定类型的Spring Bean，没有或多于一个都将报错
     */
    public static <T> T getBean(Class<T> cls) {
        return applicationContext.getBean(cls);
    }

    /**
     * 返回指定类型和指定名字的Spring Bean，没有或多于一个都将报错
     *
     * @param cls Bean类型
     * @param beanName 指定名字
     * @param <T> 类型
     * @return 返回指定类型和指定名字的Spring Bean，没有或多于一个都将报错
     */
    public static <T> T getBean(Class<T> cls, String beanName) {
        return applicationContext.getBean(beanName, cls);
    }

    /**
     * 返回指定类型的Spring Bean，没有或多于一个都将报错
     *
     * @param cls Bean类型
     * @param params params
     * @param <T> 类型
     * @return 返回指定类型和指定名字的Spring Bean，没有或多于一个都将报错
     */
    public static <T> T getBean(Class<T> cls, Object... params) {
        return applicationContext.getBean(cls, params);
    }

    /**
     * 返回指定名字的Spring Bean
     *
     * @param beanName 指定名字
     * @return 返回指定名字的Spring Bean
     */
    public static Object getBean(String beanName) {
        return applicationContext.getBean(beanName);
    }

    /**
     * 返回指定名字的Spring Bean
     *
     * @param beanName 指定名字
     * @param params params
     * @return 返回指定名字的Spring Bean
     */
    public static Object getBean(String beanName, Object... params) {
        return applicationContext.getBean(beanName, params);
    }
}
